<?php

namespace application\service;

require_once 'core/image/WideImage.php';

use application\service\BaseService;
use application\model\ImageModel;
use core\util\TextUtil;
use application\entity\input\ImageSearch;
use core\entity\Criteria;
use core\entity\Page;
use application\entity\Response;
use WideImage;

class ImageService extends BaseService {

    const other = \application\entity\enu\ImageType::_DEFAULT;
    const root = '/upload/image';
    const level = 5;

    private $imageModel;

    function __construct() {
        $this->imageModel = new ImageModel();
    }

    /**
     * Up ảnh bằng submit form
     * @param type $image
     * @param type $type
     * @param type $target
     */
    public function upload($image, $type = \application\entity\enu\ImageType::_DEFAULT, $target = '0') {
        if ($type == null) {
            $type = ImageService::other;
        }
        if (!is_array($image)) {
            return new Response(false, "Dữ liệu nhập vào không phải thông tin ảnh");
        }
        $imgT = explode("/", $image["type"]);
        if ($imgT[0] != 'image') {
            return new Response(false, "Địa chỉ không phải là ảnh");
        }

        $name = TextUtil::randomPathfile('upload/image/' . $type . '/target_' . $target . '/', ImageService::level) . $this->genName($image["name"], $image["type"]);
        WideImage::load($image['tmp_name'])->saveToFile($name);
        $this->save($name, $image["type"], $type, $target);
        return new Response(true, "Ảnh đã được thêm vào hệ thống", $name);
    }

    /**
     * Dowload ảnh từ url
     * @param type $url
     * @param type $type
     * @param type $target
     * @return string
     * @throws Exception
     */
    public function dowload($url, $type = \application\entity\enu\ImageType::_DEFAULT, $target = '0') {
        if ($type == null) {
            $type = ImageService::other;
        }
        if ($url == null) {
            return new Response(false, "Địa chỉ ảnh chưa được nhập");
        }
        $imageType = get_headers($url, 1)["Content-Type"];
        $imgT = explode("/", $imageType);
        if ($imgT[0] != 'image') {
            return new Response(false, "Địa chỉ không phải là ảnh");
        }
        try {
            if (!TextUtil::exists($url)) {
                return new Response(false, "Địa chỉ ảnh không phải là ảnh");
            }
        } catch (Exception $exc) {
            return new Response(false, "Địa chỉ ảnh không tồn tại");
        }

        $image = explode("/", $url);
        $image = TextUtil::randomPathfile('upload/image/' . $type . '/target_' . $target . '/', ImageService::level) . $this->genName(end($image), $imageType);
        WideImage::load($url)->saveToFile($image);
        $this->save($image, $imageType, $type, $target);
        return new Response(true, "Ảnh đã được thêm vào hệ thống", $image);
    }

    /**
     * Lấy ảnh
     * @param type $targetId
     * @param type $type
     */
    public function get($targetId, $type = \application\entity\enu\ImageType::_DEFAULT) {
        $imgs = $this->imageModel->get($targetId, $type);
        $images = array();
        foreach ($imgs as $image) {
            $images[] = $image->id;
        }
        return $images;
    }

    /**
     * Lấy hình ảnh theo targetId
     * @param type $targetIds
     * @param type $type
     * @return type
     */
    public function getByTargetIds($targetIds, $type = \application\entity\enu\ImageType::_DEFAULT) {
        $imgs = $this->imageModel->getByTargetIds($targetIds, $type);
        $images = array();
        foreach ($imgs as $image) {
            $target = $image->target;
            $images[$target][] = $image->id;
        }
        return $images;
    }

    public function save($name, $imageType, $type, $target) {
        $params = array(
            'id' => $name,
            'imageType' => $imageType,
            'type' => $type,
            'target' => $target,
        );
        $this->imageModel->insert($params);
    }

    private function genName($name, $imageType) {
        $explode = explode(".", trim(str_replace(" ", "-", $name)));
        $imgT = explode("/", $imageType);
        return $explode[0] . "." . $imgT[1];
    }

    /**
     * Xóa ảnh theo target
     * @param type $target
     * @param type $type
     * @return \application\entity\Response
     */
    public function deleteByTarget($target, $type = \application\entity\enu\ImageType::_DEFAULT) {
        if ($target != null && $target != '') {
            $images = $this->imageModel->get($target, $type);
            if ($images == null || count($images) == 0) {
                return new Response(false, "Không tìm thấy ảnh trên hệ thống");
            }
            foreach ($images as $image) {
                $this->delete($image->id);
            }
            $cri = new Criteria();
            $cri->andKey("target")->is($target);
            $cri->andKey("type")->is($type);
            $this->imageModel->idelete($cri);
            return new Response(true, "Ảnh đã được xóa khỏi hệ thống");
        }
        return new Response(false, "Chưa nhập target");
    }

    /**
     * Xóa ảnh theo url
     * @param type $url
     * @return \application\entity\Response
     */
    public function deleteUrl($url) {
        preg_match('/upload\/image\/(.*)/', strtolower($url), $matches);
        if (@$matches[1] != null) {
            return $this->delete("upload/image/" . $matches[1]);
        }
        return new Response(false, "Url không chính xác");
    }

    /**
     * Xóa ảnh theo id
     * @param type $id
     * @return \application\entity\Response
     */
    public function delete($id) {
        $filePath = $id;
        if (file_exists($this->baseUrl . $id)) {
            unlink($filePath);
            $this->imageModel->iremove($id);
            return new Response(true, "Ảnh đã được xóa khỏi hệ thống");
        }
        return new Response(false, "Ảnh không tồn tại trên hệ thống");
    }

    /**
     * Danh sách hình ảnh
     * @param \application\entity\input\ImageSearch $search
     * @return type
     */
    public function search(ImageSearch $search) {
        $cri = new Criteria();
        if ($search->type != null && $search->type != '') {
            $cri->andKey("type")->is($search->type);
        }
        if ($search->target != null && $search->target != '') {
            $cri->andKey("target")->is($search->target);
        }
        $page = new Page();
        $page->pageIndex($search->pageIndex, $search->pageSize);
        $dataPage = $this->imageModel->iSearch($cri, $page);
        return $dataPage;
    }

}
